package org.jsola.hr.web;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.jsola.core.Page;
import org.jsola.core.Result;
import org.jsola.hr.dto.ProductAddDTO;
import org.jsola.hr.dto.ProductUpdateDTO;
import org.jsola.hr.query.ProductQuery;
import org.jsola.hr.vo.ProductListVO;
import org.jsola.hr.vo.ProductVO;

import java.util.List;

/**
 * 产品
 *
 * @author zhr
 */
@Api(tags = "hr-产品")
public interface IProductControllerAPI {

    /**
     * 新增产品
     *
     * @param productAddDTO 产品新增实体
     * @return 产品展示对象
     */
    @ApiOperation(value = "新增产品")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "productAddDTO", dataType = "ProductAddDTO", value = "新增产品", paramType = "body")
    })
    Result<ProductVO> save(ProductAddDTO productAddDTO);


    /**
     * 修改产品
     *
     * @param productUpdateDTO 产品
     * @return 更新数量
     */
    @ApiOperation(value = "修改产品")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "productUpdateDTO", dataType = "ProductUpdateDTO", value = "修改产品", paramType = "body")
    })
    Result<Integer> update(ProductUpdateDTO productUpdateDTO);


    /**
     * 删除单个产品，彻底删除
     *
     * @param productId 产品id
     * @return 删除数量
     */
    @ApiOperation(value = "删除单个产品，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "productId", dataType = "String", value = "产品id", paramType = "path")
    })
    Result<Integer> delete(String productId);


    /**
     * 批量删除产品，彻底删除
     *
     * @param productIds 产品id集合
     * @return 删除数量
     */
    @ApiOperation(value = "批量删除产品，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "productIds", dataType = "String[]", value = "产品id数组", paramType = "body", allowMultiple = true)
    })
    Result<Integer> deleteBatch(String[] productIds);


    /**
     * 根据产品id查询产品详情
     *
     * @param productId 产品id
     * @return 产品详情
     */
    @ApiOperation(value = "根据产品id查询产品详情")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "productId", dataType = "String", value = "产品id", paramType = "path")
    })
    Result<ProductVO> findById(String productId);


    /**
     * 查询产品
     *
     * @param productQuery 产品查询参数
     * @return page
     */
    @ApiOperation(value = "查询产品")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "productQuery", dataType = "ProductQuery", value = "产品查询参数", paramType = "query")
    })
    Result<List<ProductListVO>> listAll(ProductQuery productQuery);


    /**
     * 分页查询产品
     *
     * @param productQuery 产品查询参数
     * @return page
     */
    @ApiOperation(value = "分页查询产品")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "productQuery", dataType = "ProductQuery", value = "产品查询参数", paramType = "query")
    })
    Result<Page<ProductListVO>> page(ProductQuery productQuery);

    /**
     * 查询指定产品分组下产品,传0查全部分组
     *
     * @param productName   产品名称(模糊查询)
     * @param productTypeId 产品分组Id
     * @return 指定产品分组下产品, 传0查全部分组
     */
    Result<Page<ProductListVO>> selectByProductTypeIdAndProductName(String productTypeId, String productName
            , Integer pageNo, Integer pageSize);

    /**
     * 查询租户下产品
     *
     * @return 产品列表
     */
    Result<List<ProductListVO>> selectBySite();
}

